<?php
namespace app\job;

use think\queue\Job;
use think\facade\{Log, Queue};

use app\api\model\Order;

// 取消订单
class RemoveOrder
{   
  /**
     * fire方法是消息队列默认调用的方法
     * @param Job            $job      当前的任务对象
     * @param array|mixed    $data     发布任务时自定义的数据
     */
    public function fire(Job $job, $data)
    {
        // 此处做一些 check，提前判断是否需要执行
        $isJobStillNeedToBeDone = $this->checkDatabaseToSeeIfJobNeedToBeDone($data);
        if(!$isJobStillNeedToBeDone){
            $job->delete();
            return;
        }

        // 执行逻辑处理(即：你需要该消息队列做什么)
        $isJobDone = $this->doHelloJob($data);
        if ($isJobDone){
            // 如果任务执行成功，记得删除任务
            $job->delete();
        } else {
            // 通过这个方法可以检查这个任务已经重试了几次了
            if ($job->attempts() > 3) {
                // $job->delete();
                // 也可以重新发布这个任务
                $job->release(2); // $delay为延迟时间，表示该任务延迟2秒后再执行
            }
        }
    }
    
    /**
     * 判断订单是否需要自动取消
     * @param $data 发布任务时自定义的数据
     * @return bool 任务执行的结果
     */
    private function checkDatabaseToSeeIfJobNeedToBeDone($data){
        $model = new Order();

        $where = [
            'id'     => $data['id'], 
            'status' => 1
        ];

        $order_info = $model->where($where)->find();

        if($order_info->isEmpty()){
            return false;
        }

        return true;
    }
    
    /**
     * 自动取消
     * @param $data
     * @return bool
     */
    private function doHelloJob($data)
    {
        // TODO 该处为实际业务逻辑，即：对消息中的数据进行处理
        $model = new Order();

        $inData = [
            'id'          => $data['id'],
            'status'      => 3,
            'end_time'    => time(),
        ];

        $res = $model->update($inData);

        if(!$res){
            return false;
        }

        return true;
    }
}